import { ref } from 'vue'
import {toast} from "@/uni_modules/uview-plus";

/**
 *  分页查询 Hooks
 *  @param {function} initPagination - 分页参数
 *  @param {function} apiFn - 请求接口
 *  @param {object} params - 请求参数
 *  @param {function} transform - 对请求结果转换函数
 *  @param {function} transformParams - 对请求参数进行处理
 */

export const usePagination =  ({initPagination=()=>({pageNum: 1, pageSize: 10}),apiFn,params={},transform=(val)=>val,transformParams =(val)=>val })=>{
    /** 请求数据 */
    const data =ref([])
    /** 请求参数 */
    const requestParams = ref()
    let flag;

    requestParams.value = {...params,pagination:initPagination()}
    /**
     * 获取数据
     * @param {object} outParams - 用于更新请求参数
     */
    const getData =async (outParams={})=>{
        Object.assign(requestParams.value,outParams)
        const transParams= transformParams(requestParams.value)
        const {data:fnData,error} = await apiFn({...transParams})
        if(!error){
            const result =  transform(fnData)
            if(!fnData || fnData.length<requestParams.value.pagination.pageSize){

                flag=true
            }
            data.value= data.value.concat(result||[])
        }
    }
    /**
     * 加载更多
     * @param {object} outParams - 用于更新请求参数
     * @return {Promise<Boolean>} flag - false 为可以继续加载 - true 为不可继续
     */
    const loadMore = async (outParams={})=>{
        if(!flag){
            requestParams.value.pagination.pageNum++;
            await  getData(outParams)
        }else{
            toast('没有更多了')
        }
        return flag
    }

    /**
     * 重置
     * @param {object} outParams - 用于更新请求参数
     */
    const reset = async (outParams={})=>{
        data.value=[]
        Object.assign(requestParams.value.pagination,initPagination())
        flag =false;
        await getData(outParams)
    }

    return {
        data,
        requestParams,
        getData,
        loadMore,
        reset
    }
}